package com.xzy.demo.limiting.a;

import com.xzy.demo.limiting.Limiter;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;

/**
 * 流量限制器_基于set命令（不考虑并发、事务）
 *
 * @author xzy
 * @date 2021/10/12 11:13
 */
@Slf4j
@AllArgsConstructor
public class LimiterA implements Limiter {
    /**
     * 访问次数限制
     */
    public final int limit;

    /**
     * 访问时间限制
     */
    public final int expire;

    private final RedisTemplate<String, Object> redisTemplate;

    /**
     * 是否限制访问
     *
     * @param uuid - 基于接口、用户信息生成的唯一值
     * @return - false：放行访问 true：限制访问
     */
    @Override
    public boolean isLimit(String uuid) {
        Object value = redisTemplate.opsForValue().get(uuid);

        if (value == null) {
            log.debug("无需限制：初次访问    访问次数：0");
            redisTemplate.opsForValue().set(uuid, 1, expire, TimeUnit.SECONDS);
            return false;
        }

        int accTimes = (Integer) value;
        if (accTimes < limit) {
            log.debug("无需限制：未达上限    访问次数：{}", accTimes);
            redisTemplate.opsForValue().increment(uuid);
            return false;
        }

        log.debug("限制访问：已达上限    访问次数：{}", accTimes);
        return true;
    }
}
